package csu.web.credit_bank.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import csu.web.credit_bank.pojo.Course;
import com.baomidou.mybatisplus.extension.service.IService;
import csu.web.credit_bank.pojo.Resource;
import csu.web.credit_bank.pojo.vo.SelectedCourseVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;


public interface CoursesService extends IService<Course> {
    /**
     * 创建一个新课程，并从ID池分配唯一ID.
     * @param course 不含ID的课程对象.
     * @return 包含ID的已创建课程对象.
     */
    Course createCourse(Course course);

    /**
     * 更新一个已存在的课程信息.
     * @param course 包含更新信息的课程对象.
     * @return 更新后的课程对象.
     */
    Course updateCourse(Course course);

    /**
     * 删除一个课程及其所有关联数据 (课程-资源关联, 课程-选课记录).
     * @param id 要删除的课程ID.
     * @return 如果删除成功，返回true.
     */
    boolean deleteCourse(String id);

    /**
     * 创建一个新课程，并上传封面图片.
     * @param course 不含ID的课程对象.
     * @param imageFile 上传的封面图片文件 (可以为null).
     * @return 包含ID和图片URL的已创建课程对象.
     */
    Course createCourseWithImage(Course course, MultipartFile imageFile);

    /**
     * @param teacherId 教师ID，如果为null则查询所有课程
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 课程分页数据
     */
    IPage<Course> listCoursesByTeacherId(String teacherId, int pageNum, int pageSize);

    /**
     * 根据用户ID获取已选择的课程列表（分页）
     */
    IPage<SelectedCourseVO> getSelectedCoursesByUserId(String userId, int pageNum, int pageSize);

    List<Resource> getResourcesByCourseId(String courseId);

    /**
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @param q 关键词
     */
    IPage<Course> searchCourses(int pageNum, int pageSize, String q);

    /**
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @param q 关键词
     * @param sortBy 筛选规则
     * @return 课程分页数据
     */
    IPage<Course> searchCourses(int pageNum, int pageSize, String q, String sortBy);

    List<Map<String, Object>> getCombinedCourseResourcesWithChapter(String courseId);

    IPage<Map<String, Object>> getSelectedCoursesWithProgress(String studentId, int page, int size);

    IPage<Course> searchCourses(int pageNum, int pageSize, String q, String sortBy,String teacherId);



}